import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns
from scipy import stats
import statsmodels.api as sm
from statsmodels.graphics.factorplots import interaction_plot
import warnings  # 导入警告库
import statsmodels.formula.api as smf
# 忽略特定的 FutureWarning
warnings.filterwarnings("ignore", category=FutureWarning)



plt.rcParams['font.sans-serif'] = ['SimHei']  # 使用SimHei字体
plt.rcParams['axes.unicode_minus'] = False  # 正确显示负号
# 1. 读取数据
data = pd.read_excel('合并数据集.xlsx')

# 提取材料、温度、频率、磁芯损耗、励磁波形
material = data['材料']            # 材料：材料1、材料2、材料3、材料4
temperature = data['温度，oC']          # 温度：25、50、70、90摄氏度
frequency = data['频率，Hz']            # 频率：50000—500000 Hz
core_loss = data['磁芯损耗，w/m3']       # 磁芯损耗：w/m^3
waveform = data['励磁波形']        # 励磁波形：正弦波、三角波、梯形波

# 将材料和励磁波形转为分类变量
material = material.astype('category')
waveform = waveform.astype('category')



# 2. 探索性数据分析
## 2.1 温度 vs 磁芯损耗 (散点图)
plt.figure(figsize=(8, 6))
plt.scatter(temperature, core_loss)
plt.xlabel('温度 (°C)')
plt.ylabel('磁芯损耗 (W/m^3)')
plt.title('温度 vs 磁芯损耗')
plt.grid(True)
plt.show()

## 2.2 励磁波形 vs 磁芯损耗 (箱线图)
plt.figure(figsize=(8, 6))
sns.boxplot(x=waveform, y=core_loss)
plt.xlabel('励磁波形')
plt.ylabel('磁芯损耗 (W/m^3)')
plt.title('励磁波形 vs 磁芯损耗')
plt.grid(True)
plt.show()

## 2.3 磁芯材料 vs 磁芯损耗 (箱线图)
plt.figure(figsize=(8, 6))
sns.boxplot(x=material, y=core_loss)
plt.xlabel('磁芯材料')
plt.ylabel('磁芯损耗 (W/m^3)')
plt.title('磁芯材料 vs 磁芯损耗')
plt.grid(True)
plt.show()

# 3. 相关性分析 (Spearman)
variables = pd.DataFrame({
    'Temperature': temperature,
    'Frequency': frequency,
    'CoreLoss': core_loss
})

# 计算 Spearman 相关系数
corr_matrix = variables.corr(method='spearman')
print('Spearman 相关性矩阵：')
print(corr_matrix)

# 相关性矩阵的热图
plt.figure(figsize=(8, 6))
sns.heatmap(corr_matrix, annot=True, cmap='coolwarm', cbar=True)
plt.title('Spearman 相关性矩阵')
plt.show()

# 4. 单因素分析
## 4.1 温度对磁芯损耗的影响
plt.figure(figsize=(8, 6))
bins = [0, 25, 50, 75, 100]  # 自定义温度区间
categories = pd.cut(temperature, bins)
sns.boxplot(x=categories, y=core_loss)
plt.xlabel('温度区间')
plt.ylabel('磁芯损耗 (W/m^3)')
plt.title('不同温度对磁芯损耗的影响')
plt.grid(True)
plt.show()

## 4.2 励磁波形对磁芯损耗的影响 (单因素方差分析)
anova_waveform = stats.f_oneway(*[core_loss[waveform == w] for w in waveform.unique()])
print('ANOVA for Waveform:', anova_waveform)

## 4.3 磁芯材料对磁芯损耗的影响 (单因素方差分析)
anova_material = stats.f_oneway(*[core_loss[material == m] for m in material.unique()])
print('ANOVA for Material:', anova_material)

# 5. 双因素协同作用分析
# 5.1 温度和励磁波形的交互作用
plt.figure(figsize=(8, 6))
interaction_plot(temperature, waveform, core_loss, colors=['red', 'blue', 'green'])
plt.xlabel('温度 (°C)')
plt.ylabel('磁芯损耗 (W/m^3)')
plt.title('温度与励磁波形的交互作用')
plt.grid(True)
plt.show()

# 5.2 温度和磁芯材料的交互作用
plt.figure(figsize=(8, 6))
interaction_plot(temperature, material, core_loss, colors=['red', 'blue', 'green', 'purple'])
plt.xlabel('温度 (°C)')
plt.ylabel('磁芯损耗 (W/m^3)')
plt.title('温度与磁芯材料的交互作用')
plt.grid(True)
plt.show()

# 确保将变量转换为字符串类型
waveform = waveform.astype(str)
material = material.astype(str)

# 5.3 励磁波形和磁芯材料的交互作用
plt.figure(figsize=(8, 6))
interaction_plot(waveform, material, core_loss, colors=['red', 'blue', 'green', 'purple'])
plt.xlabel('励磁波形')
plt.ylabel('磁芯损耗 (W/m^3)')
plt.title('励磁波形与磁芯材料的交互作用')
plt.grid(True)
plt.show()

# 取消警告过滤（恢复默认警告设置）
warnings.filterwarnings("default", category=FutureWarning)

# 创建一个数据框用于回归分析
tbl = pd.DataFrame({
    'material': material,
    'temperature': temperature,
    'frequency': frequency,
    'waveform': waveform,
    'core_loss': core_loss
})

# 回归模型：分析材料、温度、频率、励磁波形的独立及交互作用
model = smf.ols('core_loss ~ material * temperature * frequency * waveform', data=tbl).fit()

# 显示回归模型的结果
print('回归模型结果：')
print(model.summary())

# 显示模型系数的估计值和显著性水平
print('模型的系数及其显著性：')
print(model.params)

# 找出损耗最小的条件
predicted_losses = model.predict(tbl)
min_loss = predicted_losses.min()
min_idx = predicted_losses.idxmin()
optimal_conditions = tbl.iloc[min_idx]

print('最优条件下的磁芯损耗最小值及相应的条件：')
print(min_loss)
print(optimal_conditions)

